package des;

/**
 * @author 刘正星
 * @version 1.0.0
 * @ClassName DesUtil.java
 * @Description TODO
 * @createTime 2020年11月08日 22:25:00
 */
public class DesUtil {

    /**
     * 加密
     * @param text 待加密明文
     * @param secretKey 密钥
     * @return 密文
     */
    public static String encrypted(String text,String secretKey){
        while (text.length()<8){
            text += text + " ";
        }
        //转二进制
        byte[] strBytes = toBriny(text).getBytes();
        byte[] secretKeyBytes = toBriny(secretKey).getBytes();

        // System.out.println("明文：" + text + " 二进制: " + appendBlank(toBriny(text)));

        //调用加密算法
        byte[] secretText = DES.encrypt(strBytes, secretKeyBytes);
        String secretTextStr = new String(secretText);
        // System.out.println("密文：" + toASCll(secretTextStr) + " 二进制：" + appendBlank(secretTextStr));
        //调用解密算法
        //byte[] deText = DES.decrypt(secretText, secretKeyBytes);
        //System.out.println("解密：" + toASCll(new String(deText)) + " 二进制：" +appendBlank( new String(deText)));
        return toASCll(secretTextStr);
    }

    /**
     * 解密
     * @param secretTextStr 密文
     * @param secretKey 密钥
     * @return 明文
     */
    public static String  decrypted(String secretTextStr,String secretKey){
        byte[] secretKeyBytes = toBriny(secretKey).getBytes();
        byte[] deText = DES.decrypt(toBriny(secretTextStr).getBytes(), secretKeyBytes);

        String decryptText = new String(deText);
        return toASCll(decryptText);
    }

    //转化为二进制
    public static String toBriny(String str) {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 8; i++) {

            StringBuffer item = new StringBuffer(Integer.toBinaryString(str.charAt(i)));
            //不足8位补0
            while (item.length() < 8) {
                item.insert(0, 0);
            }
            stringBuffer.append(item);
        }
        return stringBuffer.toString();
    }

    //二进制转字符
    public static String toASCll(String str) {
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 8; i++) {
            //提取每8位一组
            String item = str.substring(i * 8, (i + 1) * 8);
            //System.out.println("item  :"+item);
            //static int parseInt(String s, int radix)
            // s -- 十进制表示的字符串。
            //radix -- 指定的基数。(基数可以是 10, 2, 8, 或 16 等进制数) 。
            stringBuffer.append((char) Integer.parseInt(item, 2));
        }

        return stringBuffer.toString();
    }
    //美化 + 空格
    public static String appendBlank(String str){
        StringBuffer stringBuffer = new StringBuffer(str);
        for (int i = 0; i < 7; i++) {
            stringBuffer.insert((i+1)*8+i," ");
        }
        return stringBuffer.toString();
    }
}